package request

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

/**
 * post方式请求
 * @param  {[type]} postUrl  string
 * @param  {[type]} headers  map[string]interface{}
 * @param  {[type]} data     map[string]interface{} [description]
 * @param  {[type]} postType post请求类型
 * @return {[type]}          [description]
 */
func Post(postUrl string, headers map[string]string, data map[string]interface{}, postType string) map[string]interface{} {

	// 声明参数
	var request *http.Request
	var res map[string]interface{}

	// json请求和普通请求
	if postType == "json" {
		request = postJson(postUrl, data)
	} else {
		request = postGeneral(postUrl, data)
	}

	// 设置头信息
	for key, value := range headers {
		request.Header.Set(key, value)
	}

	// 发送请求
	client := http.Client{}
	resp, _ := client.Do(request)

	// 获取返回信息
	body, _ := ioutil.ReadAll(resp.Body)

	// 解析
	json.Unmarshal(body, &res)

	// 返回
	return res
}

/**
 * postGeneral方式请求
 * @param  {[type]} postUrl string 请求参数
 * @param  {[type]} data    map[string]interface{} 请求数据
 * @return {[type]}
 */
func postGeneral(postUrl string, data map[string]interface{}) *http.Request {

	// 拼接参数
	strData := url.Values{}
	for key, value := range data {
		strData.Set(key, value.(string))
	}
	params := strData.Encode()

	// 生成发送参数
	reader := strings.NewReader(params)
	request, _ := http.NewRequest("POST", postUrl, reader)

	return request
}

/**
 * postJson方式请求
 * @param  {[type]} postUrl string 请求参数
 * @param  {[type]} data    map[string]interface{} 请求数据
 * @return {[type]}
 */
func postJson(postUrl string, data map[string]interface{}) *http.Request {

	// 获取参数
	bytesData, _ := json.Marshal(data)

	// 生成发送参数
	reader := bytes.NewReader(bytesData)
	request, _ := http.NewRequest("POST", postUrl, reader)

	return request
}
